    package com.java.ch031;

import java.util.Arrays;

public class PrimeNumber {
    private static boolean[] filterNumber(int num) {
        if (num < 0) {
            System.out.println("范围必须大于0");
            return null;
        }
        // 声明布尔类型数组，长度范围+1
        // 数组标注是否为质数，下标值为质数，那么对应数组元素值为true
        // 例如2为质数，isPrime[2]=true
        boolean[] isPrime = new boolean[num + 1];
        isPrime[1] = false; //1不是质数
        Arrays.fill(isPrime, 2, num + 1, true);//用true填满数组
        int n = (int) Math.sqrt(num); //Math.sqrt方法用于求开方
        for (int i = 1; i < n; i++) {
            if (isPrime[i]) { // 如果是质数，那么i的倍数不是质数
                for (int j = 2 * i; j < num; j+=i) {
                    isPrime[j] = false;
                }
            }
        }
        return isPrime;
    }

    public static void showAppointArea(int number) { // 显示指定范围内的质数
        boolean[] primes = filterNumber(number); //调用方法赋值给布尔类型的数组
        int num = 0;
        if (primes != null) {
            for (int i = 1; i < primes.length; i++) { //循环数组操作数组的元素
                if (primes[i]) { //如果数组元素值为true
                    System.out.print(i + " "); // 输出质数
                    if (++num % 10 == 0) //每输出10个质数换行
                        System.out.println();
                }
            }
            System.out.println();
        }
        System.out.println("一共有" + num + "个");
    }

    public static void main(String[] args) { //java程序的主入口处
        int number = 200;
        System.out.println("范围在"+number+"内的质数有：");
        showAppointArea(number);
//        boolean[] primes = filterNumber(10);
//        for (int i = 0; i < primes.length; i++) {
//            System.out.print(primes[i]);
//            System.out.println(" " + i);
//        }
    }
}
